package com.share51.config.mobile;

import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver;
import org.springframework.mobile.device.DeviceResolverHandlerInterceptor;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

/**
 * @author gaobo
 * @version 1.0.0
 * @ClassName DeviceResolverAutoConfiguration
 * @Description TODO
 * @Date 2020/11/2 10:10
 */
@Configuration
@ConditionalOnClass({DeviceResolverHandlerInterceptor.class, DeviceHandlerMethodArgumentResolver.class})
@AutoConfigureAfter({WebMvcAutoConfiguration.class})
@ConditionalOnWebApplication
public class DeviceResolverAutoConfiguration {

    public DeviceResolverAutoConfiguration() {
    }

    @Bean
    @ConditionalOnMissingBean({DeviceResolverHandlerInterceptor.class})
    public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {
        return new DeviceResolverHandlerInterceptor();
    }

    @Bean
    public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
        return new DeviceHandlerMethodArgumentResolver();
    }

    @Configuration
    @Order(0)
    protected static class DeviceResolverMvcConfiguration implements WebMvcConfigurer {
        private DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor;
        private DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver;

        protected DeviceResolverMvcConfiguration(DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor, DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver) {
            this.deviceResolverHandlerInterceptor = deviceResolverHandlerInterceptor;
            this.deviceHandlerMethodArgumentResolver = deviceHandlerMethodArgumentResolver;
        }

        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(this.deviceResolverHandlerInterceptor);
        }

        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(this.deviceHandlerMethodArgumentResolver);
        }
    }
}
